from datetime import datetime
import requests
from bs4 import BeautifulSoup
# 导入线程池工具，用于实现多线程并发
from concurrent.futures import ThreadPoolExecutor

start_time = datetime.now()  # 记录开始时间
# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Referer': 'https://movie.douban.com/top250'
}
def fetch_page(url):
    """抓取单个页面并解析数据"""
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        if resp.status_code == 200:
            return parse_html(resp.text)  # 解析 HTML 内容并返回结果
    except Exception as e:
        print(f"请求失败: {url}, 错误: {e}")
        return []

def parse_html(html):
    """解析 HTML 提取电影数据"""
    soup = BeautifulSoup(html, 'lxml')
    items = []  # 初始化一个空列表，用于存储解析后的电影数据
    for item in soup.select('.grid_view li'):  # 遍历页面中的电影列表项
        data = {  # 提取电影信息并存储为字典
            'title': item.select_one('.title').text,  # 提取电影标题
            'rating': item.select_one('.rating_num').text,  # 提取电影评分
            'quote': item.select_one('.inq').text if item.select_one('.inq') else '',
            'link': item.select_one('a')['href']  # 提取电影链接
        }
        items.append(data)  # 将电影信息添加到列表中
    return items  # 返回解析后的电影数据列表

def main():
    base_url = "https://movie.douban.com/top250?start={}"  # 豆瓣电影 Top 250 的基础 URL
    urls = [base_url.format(i * 25) for i in range(10)]  # 生成前 10 页的请求地址
    print(urls)  # 打印请求地址列表
    results = []  # 初始化一个空列表，用于存储抓取到的电影数据
    # 创建一个最大线程数为 8 的线程池
    with ThreadPoolExecutor(max_workers=8) as executor:
        # 提交任务到线程池
        futures = [executor.submit(fetch_page, url) for url in urls]
        for future in futures:  # 遍历线程池返回的对象
            if future.result():  # 如果任务返回结果
                results.extend(future.result())  # 将结果添加到结果列表中
    # 输出统计结果
    print(f"共获取{len(results)}部电影数据")  # 打印抓取到的电影总数
    for movie in results:  # 遍历抓取到的电影数据
        print(f"《{movie['title']}》评分：{movie['rating']}")  # 打印电影标题和评分

if __name__ == "__main__":
    main()
end_time = datetime.now()  # 记录结束时间
run_time = end_time - start_time  # 计算运行时间
print(f"程序运行时间：{run_time}")